package org.example.design.designmode.singleton;

/**
 * @Auther: lingshi
 * @Date: 2020/5/10 17:09
 * @Description: 双重锁判断模式
 * 优点:避免了内存开销问题
 * 缺点：线程不安全
 */
public class DoubleSingleton {
    private   static volatile DoubleSingleton idler ;

    private DoubleSingleton(){}

    //首先解决线程安全最开始想到的办法就是 直接在方法加synchronized
    // 1.正确返回单例   1-线程按照理想的顺序执行 2-线程2对线程1进行类覆盖
    // 2.单例失效  线程出现了锁竞争导致单例失效
    //使用双重检验锁 注意指令重排序问题，通过volatile关键字解决
    // idler = new DoubleSingleton();   内存中一块区域
    // DoubleSingleton idler ;  内存中一块区域
    public  static DoubleSingleton getInstance(){
        //判断是否需要阻塞
        if(idler==null){
            synchronized(DoubleSingleton.class){
                //判断是否需要重新创建
                if(idler==null){
                    idler = new DoubleSingleton();
                }
            }

        }

        return idler;
    }

}
